﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.Reporting.WebForms;
using Negocio.catalogos;
using Negocio;
using System.Text;

namespace Presentacion.controlasistencia
{
    public partial class reportePerdidosMaterias : System.Web.UI.Page
    {

            protected void Page_Load(object sender, EventArgs e)
            {
                catalogoCarrera _objCarrera = new catalogoCarrera();
                catalogoDistribucion _objDistribucion = new catalogoDistribucion();
                catalogoPeriodo _objPeriodo = new catalogoPeriodo();
                catalogoReporte _objReporte = new catalogoReporte();

                if (!IsPostBack)
                {
                if (Session["idDocente"] != null && Request.QueryString["cod"] != null )
                {
                    catalogoPeriodo _objCatalogoPeriodo = new catalogoPeriodo();
                    catalogoCabecera _objCatalogoCabecera = new catalogoCabecera();
                    catalogoHorario _objHorarioClases = new catalogoHorario();
                    encriptaje _objEncriptaje = new encriptaje();
                    try
                    {

                        int idPeriodoActual = int.Parse(Session["periodo"].ToString());
                        //int mes = int.Parse(postE);

                        var inicioDeClases = new catalogoCalendarioAcademico().obtenerInicioANDFinDeClases(idPeriodoActual, "#00a65a");
                        var finDeClases = new catalogoCalendarioAcademico().obtenerInicioANDFinDeClases(idPeriodoActual, "#0073b7");
                        DateTime fechacomparacion = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
                        if (inicioDeClases != null && finDeClases != null)
                        {
                            //if (inicioDeClases.start.Value.Month >= fechacomparacion.Month && ((finDeClases.start.Value.Month <= fechacomparacion.Month) || (finDeClases.start.Value.Month >= fechacomparacion.Month) || (finDeClases.start.Value.Year <= fechacomparacion.Year))) //inicioDeClases.start.Value.Month >= mes && finDeClases.start.Value.Month <= mes
                            //{

                            int codigoDistribucion = int.Parse(_objEncriptaje.decodeControlAsistencia(Request.QueryString["cod"].ToString()));
                            //var resultDistribucion = new catalogoDistribucion().obtenerDistribucionId(codigoDistribucion).First();
                           
                            var resultDistribucion = new catalogoDistribucion().obtenerDistribucionId(Convert.ToInt32(codigoDistribucion)).First();
                            lblCarrera.Text = resultDistribucion.Nombre;
                            var resultOpciones = new catalogoOpciones().obtenerNroSemanas(idPeriodoActual);
                            DateTime dia = DateTime.Now; //Obtiene dia actual
                            int totalHoraAcumuladas = 0;

                            //int totalMesActual = _objCatalogoCabecera.obtenerHorasTrabajadasMesActual(codigoDistribucion, idPeriodoActual, new DateTime(dia.Year, mes, dia.Day));
                            int totalMesActual = _objCatalogoCabecera.obtenerHorasTrabajadasMesActual(Convert.ToInt32(codigoDistribucion), idPeriodoActual, new DateTime(DateTime.Now.Year, DateTime.Now.Month, dia.Day));
                            var periodo = new catalogoPeriodo().obtenerPeriodo(idPeriodoActual).First();


                            #region Datos Horario

                            string[] diasSemana = new string[] { "LU", "MA", "MI", "JU", "VI" };
                            //Buscar inicio de semana
                            //Inicio busqueda inicio de semana
                            while (dia.DayOfWeek != DayOfWeek.Monday)
                            {
                                if (dia.DayOfWeek == DayOfWeek.Sunday)
                                {
                                    dia = dia.AddDays(1);
                                }
                                else
                                {
                                    dia = dia.AddDays(-1);
                                }
                            }

                            //Carga del horario para validacion
                            var consultaHorario = _objHorarioClases.obtenerHorarioXidPeriodoANDidDistribucion(idPeriodoActual, Convert.ToInt32(codigoDistribucion));
                            int totalSemanal = 0;
                            if (consultaHorario.Count() > 0)
                            {
                                //Bucle por cada de la semana
                                totalSemanal = 0;
                                for (int i = 0; i < 5; i++)
                                {
                                    int nroHoraDistribucion = 0;

                                    var resultFiltroHorario = consultaHorario.Where(E => E.detalle == dia.DayOfWeek.ToString()).ToList();
                                    if (resultFiltroHorario.Count() > 0)
                                    {

                                        foreach (var item in resultFiltroHorario)
                                        {
                                            TimeSpan _intervaloHoraEntrada = TimeSpan.Parse(item.horaEntrada);
                                            TimeSpan _intervaloHoraSalida = TimeSpan.Parse(item.horaSalida);

                                            //    DateTime dia1 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                                            //  DateTime dia2 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin
                                            DateTime dia1 = new DateTime(DateTime.Now.Year, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                                            DateTime dia2 = new DateTime(DateTime.Now.Year, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin

                                            nroHoraDistribucion = (dia2.Subtract(dia1)).Hours;
                                            totalSemanal = totalSemanal + nroHoraDistribucion;
                                            //fin busqueda dia de la semana                   

                                        }
                                    }
                                    dia = dia.AddDays(1);

                                }
                            }
                            else
                            {
                                totalSemanal = 0;
                            }
                            #endregion

                            if (resultOpciones != null)
                            {
                                totalHoraAcumuladas = resultOpciones.nroSemanas * totalSemanal;
                            }
                            else
                            {
                                totalHoraAcumuladas = 0;
                            }
                            //int totalMesesAnterior = _objCatalogoCabecera.obtenerHorasTrabajadasMesActual(codigoDistribucion, idPeriodoActual, new DateTime(dia.Year, mes - 1, dia.Day));
                            if (DateTime.Now.Month == 1)
                            {
                                int totalMesesAnterior = _objCatalogoCabecera.obtenerHorasTrabajadasMesActual(codigoDistribucion, idPeriodoActual, new DateTime(DateTime.Now.Year - 1, 12, dia.Day));
                            }
                            else
                            {
                                int totalMesesAnterior = _objCatalogoCabecera.obtenerHorasTrabajadasMesActual(codigoDistribucion, idPeriodoActual, new DateTime(DateTime.Now.Year, DateTime.Now.Month - 1, dia.Day));
                            }

                            string mesTexto = "";
                            switch (DateTime.Now.Month)
                            {
                                case 1:
                                    mesTexto = "ENERO";
                                    break;
                                case 2:
                                    mesTexto = "FEBRERO";
                                    break;
                                case 3:
                                    mesTexto = "MARZO";
                                    break;
                                case 4:
                                    mesTexto = "ABRIL";
                                    break;
                                case 5:
                                    mesTexto = "MAYO";
                                    break;
                                case 6:
                                    mesTexto = "JUNIO";
                                    break;
                                case 7:
                                    mesTexto = "JULIO";
                                    break;
                                case 8:
                                    mesTexto = "AGOSTO";
                                    break;
                                case 9:
                                    mesTexto = "SEPTIEMBRE";
                                    break;
                                case 10:
                                    mesTexto = "OCTUBRE";
                                    break;
                                case 11:
                                    mesTexto = "NOVIEMBRE";
                                    break;
                                case 12:
                                    mesTexto = "DICIEMBRE";
                                    break;
                                default:
                                    break;
                            }

                            /////////////////////////////////////////////////////////////////////
                            /////////////////////////////////////////////////////////////////////
                            /////////       /////////////////////////////////////////////////////
                            /////// //////// ///////////////////////////////////////////////////
                            /////// ///////  ////////////////////////////////////////////////////
                            /////// ///////  ////////////////////////////////////////////////////
                            /////// ///////  ////////////////////////////////////////////////////
                            /////// //////// ///////////////////////////////////////////////////
                            ////////        /////////////////////////////////////////////////////
                            /////////////////////////////////////////////////////////////////////
                            /////////////////////////////////////////////////////////////////////
                            var resultCAbeceralista = _objCatalogoCabecera.obtenerCabeceraXIdDistribucionANDidPeridoFiltradoColumnas(codigoDistribucion, idPeriodoActual);
                            var resultCabecera = from filtro in resultCAbeceralista
                                                 where filtro.fechaCabecera.Month <= DateTime.Now.Month || filtro.fechaCabecera.Month <= DateTime.Now.Month || filtro.fechaCabecera.Month == DateTime.Now.Month
                                                 select filtro;
                            var resultCabeceraNormal = _objCatalogoCabecera.obtenerCabeceraXIdDistribucionANDidPerido(Convert.ToInt32(codigoDistribucion), idPeriodoActual);
                            ReportParameter[] reportParameter = new ReportParameter[22];//(resultCabecera.Count() * 4) + 29
                            int contador = 0, iT = 1;
                            if (resultCabecera.Count() > 0)
                            {

                                if (resultCabecera.Count() > 25)
                                {
                                    ReportViewer1.Visible = false;
                                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('informe desbordado, contactese con el administrador.');", true);
                                }
                                else
                                {

                                    foreach (var item in resultCabecera)
                                    {

                                        int totalHoras = 0;
                                        foreach (var itemHoras in resultCabeceraNormal.Where(R => R.fechaCabecera.Date == item.fechaCabecera))
                                        {
                                            TimeSpan _intervaloHoraEntrada = TimeSpan.Parse(item.idDetalleHorario.horaEntrada);
                                            TimeSpan _intervaloHoraSalida = TimeSpan.Parse(item.idDetalleHorario.horaSalida);

                                            DateTime diaHora = DateTime.Now; //Obtiene dia actual
                                                                             //DateTime dia1 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                                                                             //DateTime dia2 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin
                                            DateTime dia1 = new DateTime(DateTime.Now.Year, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                                            DateTime dia2 = new DateTime(DateTime.Now.Year, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin

                                            int horaClaseColumna = (dia2.Subtract(dia1)).Hours;
                                            totalHoras = totalHoras + horaClaseColumna;
                                        }
                                        iT++;
                                    }

                                    reportParameter[contador] = new ReportParameter("mesActual", mesTexto);
                                    contador++;

                                    var resultDocente = new catalogoDocente().consultarDocenteXId(resultDistribucion.idDocente);
                                    if (resultDocente != null)
                                    {
                                        reportParameter[contador] = new ReportParameter("docente", resultDocente.nombre + " " + resultDocente.apellido1 + " " + resultDocente.apellido2);
                                        contador++;
                                    }
                                    else
                                    {
                                        reportParameter[contador] = new ReportParameter("docente", Session["nombresDocente"].ToString() + " " + Session["apellido"].ToString());
                                        contador++;
                                    }

                                    reportParameter[contador] = new ReportParameter("cursoMateria", resultDistribucion.Nombre);
                                    contador++;
                                    reportParameter[contador] = new ReportParameter("semestre", resultDistribucion.semestre.ToString());
                                    contador++;
                                    reportParameter[contador] = new ReportParameter("paralelo", resultDistribucion.paralelo);
                                    contador++;

                                    var horasJustificada = new catalogoBitacora().obtenerBitocaraXidDistribucionANDXTipo(Convert.ToInt32(codigoDistribucion), idPeriodoActual, 2).Sum(E => E.nroHoras);
                                    var horasINJustificada = new catalogoBitacora().obtenerBitocaraXidDistribucionANDXTipo(Convert.ToInt32(codigoDistribucion), idPeriodoActual, 2).Sum(E => E.nroHoras);


                                    reportParameter[contador] = new ReportParameter("carrera", resultDistribucion.carrera);
                                    contador++;
                                    reportParameter[contador] = new ReportParameter("periodo", periodo.nombre);
                                    contador++;


                                    var resultHorario = new catalogoReporte().obtenerHorario(idPeriodoActual, codigoDistribucion);
                                    iT = 1;
                                    foreach (var item in resultHorario)
                                    {
                                        reportParameter[contador] = new ReportParameter("ent" + iT, item.horaInicio);
                                        contador++;
                                        reportParameter[contador] = new ReportParameter("sal" + iT, item.horaFin);
                                        contador++;
                                        reportParameter[contador] = new ReportParameter("hor" + iT, item.horaClase);
                                        contador++;
                                        iT++;
                                    }

                                    ReportViewer1.LocalReport.DataSources.Clear();

                                    ReportDataSource dataSourceAsistencia = new ReportDataSource();

                                    dataSourceAsistencia.Name = "dtsReportPerdidos";
                                    dataSourceAsistencia.Value = new catalogoReporte().reportePerdedores(Convert.ToInt32(idPeriodoActual), codigoDistribucion);

                                    ReportViewer1.LocalReport.DataSources.Add(dataSourceAsistencia);

                                    ReportViewer1.LocalReport.ReportEmbeddedResource = "Presentacion.controlasistencia.reports.ReportPerdidos.rdlc";
                                    ReportViewer1.LocalReport.ReportPath = "controlasistencia/reports/ReportPerdidos.rdlc";

                                    ReportViewer1.LocalReport.SetParameters(reportParameter);
                                    ReportViewer1.LocalReport.GetParameters();
                                    ReportViewer1.Visible = true;
                                    ReportViewer1.DataBind();
                                    ReportViewer1.LocalReport.Refresh();
                                }

                            }
                            else
                            {
                                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('No existen datos para este reporte.');", true);

                            }

                        }  
                        else
                        {
                            Server.Transfer("Default.aspx");
                        }
                    }
                    
                    catch (Exception ex)
                    {
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('Error en el servidor intentelo de nuevo');", true);
                        ReportViewer1.Visible = false;
                    }
                }
            }
                    else
                    {
                        Response.Redirect("default.aspx");
                    }
                }
            }   
            
        }